<?php

class MensagemService extends Model {

    /**
     * @var MensagemDao
     */
    private $mensagemDao;
    /**
     * @var AcaoChamadoService
     */
    private $acaoChamadoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var AtendimentoService
     */
    private $atendimentoService;
    /**
     * @var ClienteService
     */
    private $clienteService;

    public function injectDependencies() {
        $this->mensagemDao = MensagemDao::getInstance();
        $this->acaoChamadoService = AcaoChamadoService::getInstance();
        $this->atendimentoService = AtendimentoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->clienteService = ClienteService::getInstance();
    }

    public function findAllBlockedMessages() {
        $ArMessages = $this->mensagemDao->findAllBlockedMessagesFromLoggedUser();
        $this->fillMessage($ArMessages);
        return $ArMessages;
    }

    public function findWaitingLiberationById($IDMensagem) {
        $Mensagem = $this->mensagemDao->findWaitingLiberationById($IDMensagem);
        $this->fillMessage($Mensagem);
        return $Mensagem;
    }

    public function blockMessage($IDMensagem) {
        return $this->mensagemDao->blockMessage($IDMensagem);
    }

    public function unblockMessage($ArDados) {
        $Mensagem = $this->generateMessage( array('TxMensagem' => $ArDados['TxMensagem'], 'IDChamado' => $ArDados['IDChamado'], 'EnStatusMensagem' => 'LIBERADO') );
        $Mensagem->setTxMensagem( sprintf($Mensagem->getTxMensagem(), $ArDados['IDMensagem']) );
        return $this->mensagemDao->unblockMessage($ArDados['IDMensagem'], $Mensagem);
    }

    private function fillMessage($MxMessage) {
        if( !empty($MxMessage) ) {
            $this->fillMessageWithCustomer($MxMessage);
            $this->fillMessageWithUser($MxMessage);
        }
    }

    public function generateMessage($ArDados) {
        $ItMessageType = $this->getMessageType($ArDados);
        $TxMessage = $this->isModelMessage($ArDados) ? $this->getModelMessage($ItMessageType) : $this->getMessage($ArDados, $ItMessageType);
        $Mensagem = new Mensagem( $TxMessage );
        $Mensagem->setAcaoChamado( $this->acaoChamadoService->findById($ItMessageType) );
        $Mensagem->generateMessage($ArDados);
        return $Mensagem;
    }

    private function getMessageType($ArDados) {
        if( isset($ArDados['EnPrioridade']) && $ArDados['EnPrioridade'] == 'true' ) {
            return AcaoChamado::MARCAR_PRIORIDADE;
        } else if( isset($ArDados['EnPrioridade']) && $ArDados['EnPrioridade'] == 'false' ) {
            return AcaoChamado::DESMARCAR_PRIORIDADE;
        } else if( isset($ArDados['TxObservacao']) ) {
            return AcaoChamado::OBSERVACAO;
        } else if( isset($ArDados['IDNewSector']) ) {
            return AcaoChamado::TROCAR_SETOR;
        } else if( isset($ArDados['TxResposta']) ) {
            return AcaoChamado::RESPOSTA;
        } else if( isset($ArDados['IDNewUser']) && $ArDados['IDNewUser'] != Dracosys::getLoggedUser()->getIDUsuario() ) {
            return AcaoChamado::TROCAR_RESPONSAVEL;
        } else if( isset($ArDados['IDNewUser']) && $ArDados['IDNewUser'] == Dracosys::getLoggedUser()->getIDUsuario() ) {
            return AcaoChamado::ASSUMIR_RESPONSABILIDADE;
        } else if( isset($ArDados['EnStatus']) && $ArDados['EnStatus'] == 'FECHADO'){
            return AcaoChamado::FECHAR_CHAMADO;
        } else if( isset($ArDados['EnStatusMensagem']) && $ArDados['EnStatusMensagem'] == 'LIBERADO' ) {
            return AcaoChamado::LIBERAR_RESPOSTA;
        }
    }

    private function getModelMessage($ItMessageType) {
        switch($ItMessageType) {
            case AcaoChamado::MARCAR_PRIORIDADE:
                return  'O usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\" INSERIU este chamado na Lista de Prioridades';
            case AcaoChamado::DESMARCAR_PRIORIDADE:
                return 'O usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\" RETIROU este chamado da Lista de Prioridades';
            case AcaoChamado::TROCAR_SETOR:
                return 'O usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\" TROCOU este chamado do SETOR \\"%s\\" para o \\"%s\\"';
            case AcaoChamado::ASSUMIR_RESPONSABILIDADE:
                return 'O usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\" ASSUMIU a responsabilidade sobre este chamado';
                break;
            case AcaoChamado::TROCAR_RESPONSAVEL:
                return 'O usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\" TRANSFERIU a responsabilidade deste chamado para o usu&aacute;rio \\"%s\\"';
                break;
            case AcaoChamado::FECHAR_CHAMADO:
                return 'O chamado foi fechado pelo usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\"';
            case AcaoChamado::LIBERAR_RESPOSTA:
                return 'O usu&aacute;rio \\"'.Dracosys::getLoggedUser()->getArDadosUsuario('StNome').'\\" liberou a resposta #%s.';
        }
    }

    private function getMessage($ArDados, $ItMessageType) {
        switch($ItMessageType) {
            case AcaoChamado::OBSERVACAO:
                return $ArDados['TxObservacao'];
                break;
            case AcaoChamado::RESPOSTA:
                return $ArDados['TxResposta'];
                break;
        }
    }

    private function isModelMessage($ArDados) {
        return empty($ArDados['TxObservacao']) && empty($ArDados['TxResposta']);
    }

    public function fillMessageWithUser($MxMessage) {
        if(!is_array($MxMessage)) {
            if( ( $MxMessage->isAnswer() || $MxMessage->isType(AcaoChamado::OBSERVACAO) ) && $MxMessage->isUserMessage() ) {
                $MxMessage->setUsuario( $this->usuarioService->findById($MxMessage->getIDUsuario()) );
            }
            return;
        }
         foreach($MxMessage as &$Message) {
            if( ( $Message->isAnswer() || $Message->isType(AcaoChamado::OBSERVACAO) ) && $Message->isUserMessage() ) {
                $Message->setUsuario( $this->usuarioService->findById($Message->getIDUsuario()) );
            }
        }
    }

    public function fillMessageWithCalled($MxMessage) {
        if(!is_array($MxMessage)) {
            $MxMessage->loadCalled();
            return;
        }
         foreach($MxMessage as &$Message) {
            $Message->loadCalled();
        }
    }

    public function findByCalled(Chamado $Chamado) {
        $ArMensagens = $this->mensagemDao->findByCalled($Chamado->getIDChamado());
        $Cliente = !$Chamado->isInternalCalled() ? $this->clienteService->findSimpleCustomerById($Chamado->getIDCliente()) : $this->usuarioService->findSimpleUserById($Chamado->getIDCliente());
        foreach( $ArMensagens as &$Mensagem ) {
            $Mensagem->setChamado($Chamado);
            if( ( $Mensagem->isAnswer() || $Mensagem->isType(AcaoChamado::OBSERVACAO) ) && $Mensagem->isUserMessage() ) {
                $Mensagem->setUsuario( $this->usuarioService->findSimpleUserById($Mensagem->getIDUsuario()) );
            }
            if( ( $Mensagem->isAnswer() || $Mensagem->isType(AcaoChamado::OBSERVACAO) ) && $Mensagem->isCustomerMessage() ) {
                $Mensagem->setCliente($Cliente);
            }
        }
        return $ArMensagens;
    }

    public function fillMessageWithCustomer($MxMessage) {
        if(!is_array($MxMessage)) {
            if( ( $MxMessage->isAnswer() || $MxMessage->isType(AcaoChamado::OBSERVACAO) ) && $MxMessage->isCustomerMessage() ) {
                $Cliente = $MxMessage->getChamado()->isInternalCalled() ? $this->usuarioService->findById($MxMessage->getIDCliente()) : $this->clienteService->findById($MxMessage->getIDCliente()) ;
                $MxMessage->setCliente( $Cliente );
            }
            return;
        }
         foreach($MxMessage as &$Message) {
            if( ( $Message->isAnswer() || $Message->isType(AcaoChamado::OBSERVACAO) ) && $Message->isCustomerMessage() ) {
                $Cliente = $Message->getChamado()->isInternalCalled() ? $this->usuarioService->findById($Message->getIDCliente()) : $this->clienteService->findById($Message->getIDCliente()) ;
                $Message->setCliente( $Cliente );
            }
        }
    }

}

?>
